﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using AgencyEntityLib.BaseEntity;
using Ecopsy.Tools;
using Ecopsy.DataTier;
using System.Web.UI.MobileControls;

using System.Web.UI;
using System.Web.UI.WebControls;

namespace FormControllers
{
    /// <summary>
    ///  Источник для дерева представляющий элементы как RB CheckBox's
    ///  Использует Tolls.js (OnSelRbNode)
    ///  Параметры - класс RbContext
    ///  TreeRbContext.DivClass - класс дива в котором живет дерево
    ///  TreeRbContext.NodeClass - класс элементов дерева
    ///  TreeRbContext.OnlyLeaf - показывать только конечные листы (по умолчанию)
    ///  TreeRbContext.OnChBoxBind - функция   определяющая - чекнут бокс или нет. Параметр - TreeNodeItem
    /// </summary>
    public class TreeNodeFormatter_Rb : F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData
    {
        public TreeRbContext _Context = null;
        public TreeNodeFormatter_Rb(TreeEntitySingle obj, TreeRbContext Context)
            : base(obj)
        {
            _Context = Context;
        }

        public override F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData GetNewObj(TreeEntitySingle nd)
        {
            return new TreeNodeFormatter_Rb(nd, _Context);
        }
        
        public override string ToString()
        {
            string OutPut = "";
            string ChChecked = "";
            TreeDictionaryItem nd = (TreeDictionaryItem)_nd;
            
            if(_Context.OnChBind!=null)
                        if (_Context.OnChBind(_nd))                 
                            ChChecked = "Checked='Checked'";

            if (null != _Context.OnNodeRendering)
                return _Context.OnNodeRendering(_nd); 
            
            if (_nd.ChildNodes.Count == 0)
            {
                OutPut = "<input id='" + _nd.ID + "' type='checkbox'" + ChChecked +
                          " class='" + _Context.NodeClass +
                          "' onclick=\"OnSelRbNode('" + _nd.ID + "','" + _Context.DivClass + "','" + _Context.NodeClass + "','" + _Context.HfId + "' );\" />";
            }
            OutPut = OutPut + "<a ID=rbLnk_" + _nd.ID + "\"> " + nd.Name + "</a>";
            return OutPut;
        }
        
        
        public class TreeRbContext
        {
            public string DivClass { get; set; }
            /// <summary>
            /// Hidden field - контейнер для ид выбранной ноды
            /// </summary>
            public string HfId { get; set; }
            /// <summary>
            /// css ноды
            /// </summary>
            public string NodeClass { get; set; }
            private bool _OnlyLeaf = true;
            /// <summary>
            /// только конечные ветки ставить чек
            /// </summary>
            public bool OnlyLeaf { get { return _OnlyLeaf; } set { _OnlyLeaf = value; } }
            /// <summary>
            /// Функция вычисляющая - нажат чеквокчс или не очень
            /// </summary>
            public Func<TreeEntitySingle, bool> OnChBind { get; set; }

            /// <summary>
            /// Событие возникающее перед прорисовкой ноды. Если оно определено используется HTML формируемый этим событием                        
            /// </summary>
            public Func<TreeEntitySingle, string> OnNodeRendering { get; set; }
 
        }


    }


    /// <summary>
    /// реализация Rb CheckBox для дерева сотрудников
    /// </summary>
    public class TreeNodeFormatter_Rb_EmplTree : TreeNodeFormatter_Rb
    {
        public class TreeEmplWrap : TreeEntitySingle
        {
            public Employeer Employeer { get; set; }
        }

        private string GetText(Employeer Empl )
        {
            string OutPut = "";
            string ChChecked = "";
            Department nd = (Department)_nd;

            TreeEmplWrap Empl_nd = new TreeEmplWrap();
            Empl_nd.Employeer = Empl;

            if (_Context.OnChBind(Empl_nd)) 
                    ChChecked = "Checked='Checked'";
            
            OutPut = "<input id='" + Empl.ID + "' type='checkbox'" + ChChecked +
                          " class='" + _Context.NodeClass +
                          "' onclick=\"OnSelRbNode('" + Empl.ID + "','" + _Context.DivClass + "','" + _Context.NodeClass + "','" + _Context.HfId + "' );\" />";

            OutPut = OutPut + "<a ID=rbLnk_" + Empl.ID + "\"> " + Empl.FirstName + "</a>";
            return OutPut;
        }

        public TreeNodeFormatter_Rb_EmplTree(TreeEntitySingle obj, TreeRbContext Context):base(obj,Context )
        {
        }

        public override System.Web.UI.IHierarchicalEnumerable GetChildren()
        {
            Ecopsy.Tools.F_TreeDataSource.F_TreeDataSourceView.TreeHierarchicalEnumerable fshe = new Ecopsy.Tools.F_TreeDataSource.F_TreeDataSourceView.TreeHierarchicalEnumerable();
            _nd.ChildNodes.Reset();

 
            Department d = (Department)_nd;
            List<Employeer> l = d.GetEmployeers();
            foreach (Employeer item in l)            
            {

                TreeNode nn = new TreeNode();
                nn = new TreeNode();
                nn.Text = GetText(item);
                fshe.Add(new TreeNodeHierarchyData(nn));

            }

            foreach (TreeEntitySingle n in _nd.ChildNodes)
            {   
                fshe.Add(GetNewObj(n));

            }
            return fshe;
        }
        

        public override string ToString()
        {
            Department nd = (Department)_nd;
            return nd.Name;            
            
        }
        
        public override F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData GetNewObj(TreeEntitySingle nd)
        {
            return new TreeNodeFormatter_Rb_EmplTree(nd, _Context); ;
        }
    }




    /// <summary>
    /// Форматировщик ноды - вызывающий функции при форматировании нод 
    /// </summary>
    public class TreeNodeFormatter_Fn : F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData
    {
        private Func<TreeEntitySingle, string> P_CallBack = null;
        private Func<TreeEntitySingle, string> S_CallBack = null;
        public TreeNodeFormatter_Fn(        TreeEntitySingle obj, 
                                            Func<TreeEntitySingle, string> Patch_CallBack,
                                            Func<TreeEntitySingle, string> ToString_CallBack
                                    )
            : base(obj)
        {
            P_CallBack = Patch_CallBack  ;
            S_CallBack = ToString_CallBack ;
        }

        public override string Path
        {
            get
            {
                return P_CallBack(_nd);
            }
        }

        public override string ToString()
        {
            return S_CallBack(_nd ) ;
        }
        

        public override F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData GetNewObj(TreeEntitySingle nd)
        {
            return new TreeNodeFormatter_Fn(nd, P_CallBack,S_CallBack);
        }
    }

    /// <summary>
    /// Форматировщик для древовидных справочников Элементов ТрееDictionaryItem
    /// </summary>
    public class ТрееDictionaryItemFormatter : F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData
    {
        public ТрееDictionaryItemFormatter(TreeEntitySingle obj) : base(obj) { }

        public override F_TreeDataSource.F_TreeDataSourceView.F_TreeHierarchyData GetNewObj(TreeEntitySingle nd)
        {
            return new ТрееDictionaryItemFormatter(nd);
        }

        public override string ToString()
        {
            return ((TreeDictionaryItem)_nd).Name;
        }

        public override string Path
        {
            get
            {
                return _nd.ID;
            }
        }

        public override object Item
        {
            get
            {
                return _nd;
            }
        }
    }



    /// <summary>
    /// Форматировщик для объектов TreeNode
    /// </summary>
    public class TreeNodeHierarchyData : IHierarchyData
    {

        public TreeNodeHierarchyData(TreeNode obj)
        {
            _nd = obj;
        }

        private TreeNode _nd = null;

        public virtual IHierarchicalEnumerable GetChildren()
        {
            Ecopsy.Tools.F_TreeDataSource.F_TreeDataSourceView.TreeHierarchicalEnumerable fshe = new F_TreeDataSource.F_TreeDataSourceView.TreeHierarchicalEnumerable();

            foreach (TreeNode n in _nd.ChildNodes)
            {
                fshe.Add(new TreeNodeHierarchyData(n));


            }
            return fshe;
        }

        public virtual IHierarchyData GetParent()
        {
            if (null == _nd.Parent) return null;
            return new TreeNodeHierarchyData(_nd.Parent);
        }



        public virtual bool HasChildren
        {
            get
            {
                //return true;
                return _nd.ChildNodes.Count > 0;
            }
        }

        public virtual string Path
        {
            get
            {
                return _nd.Value.ToString();
            }
        }

        public virtual object Item
        {
            get
            {
                return _nd;
            }
        }

        public virtual string Type
        {
            get
            {
                return "TreeNode";
            }
        }

        public override string ToString()
        {
            return _nd.Text;
        }


    }
}